7213
331
Nie jestem pewien, jak naprawdę wyrazić moje pytanie, więc spróbuję to wyjaśnić na przykładzie:
Powiedzmy, że mój program zachowuje się dziwnie przy określonej akcji. Już znalazłem kod, który jest przyczyną tego dziwnego zachowania. Po wyłączeniu tej sekwencji nie mam takiego zachowania. Niestety potrzebuję tego kodu bo coś innego wtedy nie działa.
Więc to, co teraz zrobię, to ustalenie, dlaczego coś dzieje się inaczej, gdy ten fragment kodu jest aktywny.
Aby lepiej zrozumieć, co się dzieje, czasami chcę uruchomić całą akcję, w tym „zły kod”, a czasami bez. Następnie mogę porównać wynik, na przykład to, co dzieje się w interfejsie użytkownika lub co zwraca moja funkcja.
Pierwsze podejście, które przychodzi mi do głowy, to uruchomienie programu z włączonym kodem, zrobienie tego, co chcę, a następnie zatrzymanie programu, skomentowanie kodu, ponowna kompilacja i ponowne uruchomienie. Um ... to brzmi głupio. Zwłaszcza jeśli potem ponownie będę musiał włączyć ten kod, aby zobaczyć inne zachowanie innym razem, a następnie ponownie wyłączyć, włączyć i wyłączyć i tak dalej.
Nie jest dla mnie opcją używanie punktów przerwania i wpływanie na kolejność instrukcji lub modyfikowanie wartości tak, aby uruchamiać lub nie napotykać instrukcje if, pętle for itp. Dwa przykłady:
Debuguję zachowanie krytyczne dla synchronizacji, a kiedy zatrzymuję program, synchronizacja znacznie się zmienia. Zatem pierwszy punkt przerwania, który mogę ustawić, musi znajdować się na końcu działania. 1
Oczekuję, że pojawi się podpowiedź lub inne okno, które jest „wygaszane”, gdy fokus jest ustawiony na VS. Dlatego w ogóle nie mogę używać żadnych punktów przerwania. Ani na początku, ani na końcu akcji 1
Czy w programie Visual Studio 2012 jest jakaś technika, która pozwala mi oznaczyć ten kod jako opcjonalny i mogę zdecydować, czy chcę uruchomić tę sekwencję kodu, zanim wykonam akcję? Myślę o czymś w rodzaju if (prawda | fałsz) na wyższym poziomie.
Nie szukam rozwiązania, które wymagałoby kilkukrotnego ponownego uruchamiania programu. W takim przypadku nadal mógłbym wykonać proste podejście, po prostu wykomentować kod z #if false.
1 Zwróć uwagę, że mogę oczywiście ustawić punkt przerwania, gdy muszę spojrzeć na określoną zmienną w określonej pozycji (jeśli nie zapisałem wartości na wyjściu), ale ponownie wyłączy punkty przerwania, aby uruchomić całą akcję w jednym udać się. 
W debugerze programu Visual Studio można ustawić punkt przerwania bezpośrednio przed „kwestionowanym kodem”. Kiedy kod zatrzyma się w tym momencie, możesz pozwolić mu kontynuować lub kliknąć prawym przyciskiem myszy dowolną inną linię i wybrać Ustaw następną instrukcję.
To trochę dziwna opcja, ale zacząłem to doceniać.
|
Jedyną opcją, o której przychodzi mi do głowy, jest dodanie do interfejsu użytkownika czegoś, co pojawia się tylko podczas debugowania, dając możliwość włączenia / wykluczenia danych operacji.
Skoro już to robisz, możesz chcieć włączyć resetowanie aplikacji do „znanego stanu” również z poziomu interfejsu użytkownika.
|
Myślę o czymś w rodzaju if (prawda | fałsz) na wyższym poziomie.
Dlaczego „na wyższym poziomie”? Dlaczego nie użyć dokładnie tego?
Chcesz, aby kawałek kodu był czasami wykonywany, czasami nie, a przełącznik powinien być zmieniany w czasie wykonywania, a nie w czasie kompilacji - to oczywiście prowadzi do
jeśli (stan)
{
// kod w stawce
}
Haczyk polega na tym, jakiego rodzaju warunku użyjesz - może to zmienna, którą ustawisz na true w wydanej wersji kodu, a czasami na false w wersji debugowania. Może wartość jest pobierana z pliku konfiguracyjnego, może ze zmiennej środowiskowej, może obliczana przez jakąś logikę w twoim programie, cokolwiek i kiedykolwiek chcesz.
EDYCJA: możesz także wprowadzić do swojego kodu zmienną boolowską dla warunku, zainicjować ją domyślnie na true i zmienić jej wartość za pomocą debugera, kiedy tylko chcesz.
|
Dyrektywy preprocesora mogą być tym, czego szukasz. Są to fragmenty kodu do wykonania przez kompilator, które można zidentyfikować zaczynając od znaku # (i stylistycznie, domyślnie nie są zgodne z wzorcem wcięć Twojego kodu, zamiast tego zawsze znajdują się mocno przy lewej krawędzi edytora ):
# zdefiniować INCLUDE_DODGY_CODE
public void MyMethodWithDodgyBits () {
#if INCLUDE_DODGY_CODE
myDodgyMethod ();
#endif
myOkMethod ();
}
W tym przypadku, jeśli #define INCLUDE_DODGY_CODE został dołączony, wywołanie myDodgyMethod () zostanie wkompilowane w twój program. W przeciwnym razie wywołanie zostanie pominięte przez kompilator i po prostu nie będzie istnieć w twoim pliku binarnym.
|
Istnieje kilka opcji debugowania, o które prosisz.
Program Visual Studio ma wiele opcji umożliwiających bezpośrednie nawigowanie po kodzie. Możesz użyć funkcji Ustaw następną instrukcję, aby przejść bezpośrednio do określonej instrukcji. Wartości można również edytować bezpośrednio w oknie bezpośrednim, QuickWatch i etykietce narzędzi, która znajduje się nad zmiennymi podczas debugowania.
Visual Studio ma również możliwość odtwarzania historii wykonywania. Aby rozpocząć, zapoznaj się z IntelliTrace. Może to być pomocne, gdy istnieje wiele obszarów niepokoju, które wchodzą w interakcje i generują stan błędu.
Możesz także zawijać sekcje kodu w bloki warunkowe i odpowiednio ustawiać zmienne warunkowe. Może to mieć miejsce podczas debugowania lub możesz przekazać parametry przez plik konfiguracyjny. Korzystanie z kontroli warunkowych może być łatwiejsze niż ręczne przechodzenie przez kod, jeśli istnieje wiele instrukcji, które chcesz wykluczyć.
|
Czasami zależy to od wersji VS i języka, ale możesz szczęśliwie edytować kod (aby go skomentować lub zawinąć w duże #ifdef 0), a następnie nacisnąć alt + F10, a kompilator przekompiluje, ponownie połączy i będzie kontynuował wykonywanie jakbyś nigdy się nim nie bawił.
Ale chociaż działa to pięknie w VC ++ (od VS v6 IIRC), C # może mieć problemy - znajduję (z VS2010), że nie mogę edytować i kontynuować w ten sposób z funkcjami zawierającymi dowolne instrukcje lambda (głównie linq) i 64-bitowy kod też nigdy tego nie robiłem. Mimo to warto eksperymentować, ponieważ czasami jest to naprawdę przydatne.
|
Pracowałem nad aplikacjami, które mają opcjonalny kod używany do samego debugowania, który nie powinien pojawiać się w środowisku produkcyjnym. Ten segment opcjonalnego kodu był dla nas najłatwiejszy do kontrolowania za pomocą pliku konfiguracyjnego, ponieważ nie wymagał ponownej kompilacji w celu zmiany.
Taka poprawka może nie być końcem dla twojego końcowego rezultatu, ale może pomóc przetrwać, dopóki nie zostanie znaleziona. Jeśli masz wiele opcjonalnych sekcji, które należy przetestować w połączeniu, ten styl naprawy może wymagać wielu kluczy w pliku konfiguracyjnym, co może być wadą i trudnym do śledzenia.
|
Twoje pytanie nie jest do końca jasne, prawdopodobnie dlatego jest tak wiele odpowiedzi, które Twoim zdaniem są nieważne. Możesz rozważyć przeformułowanie go, jeśli wydaje się, że nikt nie jest w stanie odpowiedzieć na pytanie.
Ryzykując udzielenie kolejnej nieważnej odpowiedzi, dodam trochę informacji o tym, jak radziłem sobie z tym problemem w przeszłości.
Najłatwiej jest umieścić w nim dowolny opcjonalny kod
#if DEBUG
// Opcjonalny kod tutaj
#endif
W ten sposób, gdy uruchamiasz w trybie debugowania, kod jest implementowany, a gdy uruchamiasz w trybie wydania, tak nie jest. Przełączanie się między nimi wymaga kliknięcia jednego przycisku.
Ten sam problem rozwiązałem również w podobny sposób za pomocą prostej flagi:
bool runOptionalCode = false;
następnie
if (runOptionalCode)
{
// Tutaj umieść opcjonalny kod
}
Jeszcze raz,Przełączanie się między trybami wymaga zmiany jednego słowa, więc jest to proste zadanie. Wspominasz o tym w swoim pytaniu, ale pomijasz to z niejasnych powodów. Jak powiedziałem, przełączanie się między nimi wymaga bardzo niewielkiego wysiłku.
Jeśli chcesz wprowadzić zmiany między kodem podczas jego działania, najlepszym sposobem jest użycie elementu interfejsu użytkownika lub naciśnięcia klawisza, który modyfikuje flagę wspomnianą w powyższym przykładzie. Jednak w zależności od aplikacji może to wymagać więcej wysiłku niż jest to warte. W przeszłości stwierdziłem, że kiedy mam już zaimplementowany odbiornik kluczy jako część projektu, kilka naciśnięć klawiszy decyduje, czy uruchomić mój kod debugowania (opcjonalny) działa najlepiej. W aplikacji bez kluczowych słuchaczy wolałbym trzymać się jednej z poprzednich metod.
|
Twoja odpowiedź
StackExchange.ifUsing ("editor", function () {
StackExchange.using ("externalEditor", function () {
StackExchange.using ("snippets", function () {
StackExchange.snippets.init ();
});
});
}, "fragmenty kodu");
StackExchange.ready (function () {
var channelOptions = {
tagi: „” .split („”),
id: "1"
};
initTagRenderer ("". split (""), "" .split (""), channelOptions);
StackExchange.using ("externalEditor", function () {
// Muszę uruchomić edytor po fragmentach, jeśli fragmenty są włączone
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using ("snippets", function () {
createEditor ();
});
}
else {
createEditor ();
}
});
function createEditor () {
StackExchange.prepareEditor ({
useStacksEditor: false,
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: prawda,
przyrostek: "",
imageUploader: {
brandingHtml: „Obsługiwane przez \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" ikona-svg \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7,94324 47,1084 7,58816C47.4091 7,46349 47,7169 7,36433 48,0099 7,26993C48.9099 6,97997 49,672 6,73443 49,672 5,93063C49.672 5,22043 48,9832 4,61182 48,1414 4,61182C47.4335 4,61182 46,7256 4,9256,43,43354,61182 46,7256 4,9168,60 468,56 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46,1709 13.2535 46,1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419C4184184.492 1448.1709 1448.1709 41,5985 12,6954 41,5985 10,1419V6,59049C41,5985 5,28821 41,1394 4,66232 40,1061 4,66232C39.0732 4,66232 38,5948 5,28821 38,5948 6,59049V9.60062C38,5948 10,8521 38,2696 11,5455 37,0451 11,5455C35 521 35,4954 9,60062V6,59049C35,4954 5,28821 35,0173 4,66232 34,0034 4,66232C32,9703 4,66232 32,492 5,28821 32,492 6,59049V10,1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = d = \ "M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.663.4.865 C287.4659.465104.6659.5785.75. .1369 4,56087 21,0134 6,57349 21,0134 9,27932C21.0134 11,9852 23,003 13,913 25,3754 13,913C26,5612 13,913 27,4607 13,4902 28,1109 12,6616C28.1109 12,7229 28.1161 12,7799 28,121 12,8341C28.1256 12,8341308,1253 28,1302,83 28,1302,130,130,130,125,8341301 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335ZM97 24.6335ZM97 24.6335ZM24. 27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.8045 11,95612C1962 13,862 13,862 13,862. 19,8079 13,2535 19,8079 11,9512V8.12928C19.8079 5,82936 18,4879 4,62866 16,4027 4,62866C15,1594 4,62866 14,279 4,98375 13,3609 5,88013C12,653 5,05154 11,6581 4,62866 10,3573 4,62866C9.34336 4,62866 8,5766C9,34336 4,62866 8,5766C9,34336 4,62866 8,57664,83,63 4,86603 4,86603 4,66,66 4,83,63 4,86164,86164,66 6,66 4,86163 4,96 6,63 4,96 6,63 4,96 4,66 4,86 ​​6,67 5,00066 5,28821 5,00066 6,59049V11.9512C5.00066 13,2535 5,47873 13,8962 6,51203 13,8962C7,54479 13,8962 8,0232 13,2535 8,0232 11,9512V8.90741C8.0232 7,58817 8,44431 6,91179 9,53458 6,91179C107910,5104 611,812,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,8108 962 8,0232 8,0232 13,2535 8,0232 11,9512V8.90741C8.0232 7,58817 8,44431 6,91179 9,53458 6,91179C1079 10,5104 611,811,811,811,811,811,812,8108 611,811,8108 10,811,811,8108 611,811,8108 10,811,8108 611,810,8109 C13.4375 13,8962 13,9157 13,2535 13,9157 11,9512V8.90741C13.9157 7,58817 14,3365 6,91179 15,4269 6,91179C16,4027 6,91179 16,8045 7,58817 16,8045 8,94108V11,9512Z \ "/ \ u003e \ u003cpath d = \ "M3.31675 6,59049C3.31675 5,28821 2,83866 4,66232 1,82471 4,66232C0,791758 4,66232 0,313354 5,28821 0,313354 6,59049V11,9512C0,313354 13,2535 0,791758 13,8962 1,82471 13,8975,862C2,85713,2535 3,31675 11,9512V6,59049Z \ "/ \ u003e \ u003cścieżka d = \" M1,87209 0,400291C0,843612 0,400291 0 1,1159 0 1,98861C0 2,87869 0,822846 3,57676 1,87209 3,57676C2,90056 3,57786 3,7234 1,6234 1,68291 2,8734 0.400291Z \ "fill = \" # 1BB76E \ "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e",
contentPolicyHtml: "Wkład użytkowników licencjonowany na mocy \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (polityka treści) \ u003c / a \ u003e",
allowUrls: true
},
onDemand: prawda,
discardSelector: ".discard-answer"
, natychmiastShowMarkdownHelp: true, enableSnippets: true
});
}
});
Dziękujemy za przesłanie odpowiedzi na temat Stack Overflow!
Pamiętaj, aby odpowiedzieć na pytanie. Podaj szczegóły i udostępnij swoje badania!
Ale unikaj…
Proszenie o pomoc, wyjaśnienia lub odpowiadanie na inne odpowiedzi.
Wygłaszanie oświadczeń na podstawie opinii; poprzyj je referencjami lub osobistym doświadczeniem.
Aby dowiedzieć się więcej, zapoznaj się z naszymi wskazówkami dotyczącymi pisania świetnych odpowiedzi.
Wersja robocza zapisana
Wersja robocza odrzucona
Zarejestruj się lub zaloguj
StackExchange.ready (function () {
StackExchange.helpers.onClickDraftSave ('# login-link');
});
Zarejestruj się za pomocą Google
Zarejestruj się za pomocą Facebooka
Zarejestruj się przy użyciu adresu e-mail i hasła
Zatwierdź
Opublikuj jako gość
Nazwa
E-mail
Wymagane, ale nigdy nie pokazywane
StackExchange.ready (
function () {
StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f19425104% 2fcan-i-zaznacz-jakiś-kod-jako-opcjonalny-podczas-debugowania-w- visual-studio-2012% 23new-answer ',' question_page ');
}
);
Opublikuj jako gość
Nazwa
E-mail
Wymagane, ale nigdy nie pokazywane
Opublikuj swoją odpowiedź
Odrzucać
Klikając „Opublikuj odpowiedź”, akceptujesz nasze warunki korzystania z usługi, politykę prywatności i politykę dotyczącą plików cookie
Nie szukasz odpowiedzi? Przejrzyj inne pytania z tagami debugowania Visual Studio lub zadaj własne pytanie.